package com.czy.echat.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import javax.servlet.ServletContext;

/**
 * Spring websocket配置类
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    /**
     * 定义接收/websocket时采用wensocket连接，添加HttpSessionHandshakeInterceptor是为了websocket握手前将httpsession中的属性
     * 添加到websocket session中，withSockJS添加对sockJS的支持
     *
     * registerStompEndpoints: 这个方法用于注册 STOMP 端点，客户端将连接到这些端点。
     * registry.addEndpoint("/websocket"): 添加一个端点，客户端可以通过这个端点连接到服务器。"/websocket" 是端点的路径。
     * .withSockJS(): 启用 SockJS，它提供了一个浏览器中 WebSocket 的降级方案，如果浏览器不支持 WebSocket，SockJS 将尝试使用其他传输机制（如长轮询）来模拟 WebSocket。
     *
     * @param stompEndpointRegistry
     */
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/websocket").addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS();
    }

    /**
     * configureMessageBroker用来配置消息代理，以/app为头的url将会先经过@MessageMapping
     * /topic直接进入消息代理
     * MessageBrokerRegistry 提供了配置消息代理的 API。
     * 使用了 enableSimpleBroker("/topic")，这是 Spring 提供的内置消息代理，适用于开发和测试环境，但通常不推荐用于生产环境。
     * @param registry
     */

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app")
                .enableSimpleBroker("/topic");
    }

    /*
    实现中使用了 enableStompBrokerRelay("/topic")，这表示消息将通过外部消息代理（如 RabbitMQ）进行中继。
    这种方式适用于生产环境，因为它支持更高级的消息队列功能，如持久化、事务和集群。
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic") //启用 STOMP 消息代理中继，"/topic" 是一个前缀，用于区分发送到消息代理的 STOMP 目的地。这里配置了 STOMP 消息将转发到外部消息代理（如 RabbitMQ 或 ActiveMQ）。
              .setRelayHost("localhost")  // 设置外部消息代理的主机名。
              .setRelayPort(61613)    //设置外部消息代理的端口，61613 是一个常用的端口，用于连接到 STOMP 兼容的消息代理。
              .setClientLogin("guest")  // 设置连接到消息代理时使用的登录用户名。
              .setClientPasscode("guest");  // 设置连接到消息代理时使用的密码。
        config.setApplicationDestinationPrefixes("/app");
    }
    * */
}
